package AnalizadorSintactico;

import java.util.ArrayList;

import javax.swing.tree.DefaultMutableTreeNode;

import AnalizadorLexico.Lexema;
import AnalizadorSemantico.SimboloCampo;
import AnalizadorSemantico.UtilidadesSemanticas;

public class LlamadaAMetodo extends Sentencia implements PalabraReservada {

	private Lexema nombreMetodo;
	private Lexema nombreObjeto;
	private ArrayList<Lexema> parametros;
	private String ambito;
	private ArrayList<SimboloCampo> tablaCampos;

	public LlamadaAMetodo(Lexema nombreObjeto, Lexema nombreMetodo,
			ArrayList<Lexema> parametros) {
		this.nombreMetodo = nombreMetodo;
		this.parametros = parametros;
		this.nombreObjeto = nombreObjeto;
	}

	@Override
	public DefaultMutableTreeNode getSubArbol() {
		return new DefaultMutableTreeNode(this);
	}

	@Override
	public String toString() {
		String params = "";
		if (parametros != null) {
			for (int i = 0; i < parametros.size(); i++) {
				params += parametros.get(i).getLexema();
			}
		}
		return "invocacion de metodo: " + nombreObjeto.getLexema() + "."
				+ nombreMetodo.getLexema() + "( " + params + " )";
	}

	public String evaluarTipoResultante() {
		return null;
	}

	public Lexema getNombreMetodo() {
		return nombreMetodo;
	}

	public Lexema getNombreObjeto() {
		return nombreObjeto;
	}

	public ArrayList<String> getParametros() {

		ArrayList<String> params = new ArrayList<String>();

		for (Lexema i : parametros) {
			String paramId = i.getLexema();
			String tipoResultante = "";
			// primero busca en el ambito local
			for (SimboloCampo j : tablaCampos) {
				if (j.getNombre().getLexema().equals(paramId)
						&& j.getAmbito().equals(ambito)) {
					// la variable existe en el ambito actual, entonces
					// obtenemos el tipo
					tipoResultante = j.getTipo().getLexema();
					params.add(tipoResultante);
				}
			}
			// primero busca en el ambito global
			for (SimboloCampo j : tablaCampos) {
				if (j.getNombre().getLexema().equals(paramId)) {
					// la variable existe en el ambito global, entonces
					// obtenemos el tipo
					tipoResultante = j.getTipo().getLexema();
					params.add(tipoResultante);
				}
			}
			UtilidadesSemanticas.reportarError("el parametro " + paramId
					+ " jamas fue declarado");
			params.add(NULL);
		}

		return params;
	}

	public void setAmbito(String ambito) {
		this.ambito = ambito;
	}

	public void setTablaCampos(ArrayList<SimboloCampo> tablaCampos) {
		this.tablaCampos = tablaCampos;
	}

}
